#ifndef SDL_JEU_INCLUDED
#define SDL_JEU_INCLUDED

#include "jeu.h"
#include "SDL_Joueur.h"
#include <SDL/SDL.h>

#define SPRITES_TERRAIN 0
#define SPRITES_HERO 1
#define SPRITES_MONSTRES 2
#define SPRITES_TIRS 3
#define SPRITES_GUI 4
#define SPRITES_OBJETS 5
#define SPRITES_GUIOBJET 6
#define NBSPRITE 7

#define TAILLE_SPRITE 100
#define TAILLE_PORTE 150
#define TAILLE_BORDHOR 100
#define TAILLE_BORVERT 100

#define NB_ENNEMI 14

/**
 * \file SDL_Jeu.h
 * \brief Interface graphique entre jeux et utilisateur
 * \author Nathanaël Desjobert / Saul Nicolas
 * \date 20 Avril 2013
 *
 * Interface graphique de "une retraite en enfer"
 *
 */

/********************************************//**
 * \struct Annimation
 *
 * \brief Une annimation est une suite de sprite affiché de gauche à droite
 *
 ***********************************************/
typedef struct
{
    SDL_Rect cadre;/**< le cadre à afficher */
    int nbanim;/**< Nombre d'etapes dans l'annimation */
    int n;/**< Etat de l'annimation */
    int x;/**< endroit où afficher l'annimation */
    int y;/**< endroit où afficher l'annimation */
    int sprite;/**< Feuille de Sprite à utiliser */
    float timer;/**< Timer */
    float intervalle;/**< intervalle de temps entre deux étapes */
} Animation;

/********************************************//**
 * \struct Animtab
 * \brief Tableau dynamique de taille variable d'annimations
 *
 ***********************************************/
typedef struct
{
    Animation* Tab;
    int nbuti;
    int nbmax;
} Animtab;

/********************************************//**
 * \struct SDL_Jeu
 *
 * \brief Structure pour la l'interface graphique
 *
 ***********************************************/
typedef struct
{
    Jeu J; /**< Le jeu fournit par le noyau fonctionnel */
    Animtab A; /**< Le tableau d'annimation */
    SDL_Surface **Sprites; /**< Le tableau de sprites */
    int nbsprites; /**< Le nb de sprite du tableau */
    SDL_Rect Spritpied; /**< L'etat d'annimation du bas du personnage */
    SDL_Rect Sprittete; /**< L'etat d'annimation du haut du personnage */
    float timerannimhero; /**< Timer d'annimation du personnage */
    SDL_Rect SpritMouche;/**< L'etat d'annimation de la mouche */
    float timerMouche;/**< Timer d'annimation de la mouche */
    SDL_Rect SpritLimace;/**< L'etat d'annimation de la limace */
    float timerLimace;/**< Timer d'annimation de la limace */
    float tempstir;/**< temps du dernier tir */
    float angletir;/**< angle du dernier tir */
    char etatcarte;/**< L'etat d'annimation de la carte */
    SDL_Joueur J1;/**< La config du joueur */
    int offsetx;/**< Le centrage de l'affichage */
    int offsety;/**< Le centrage de l'affichage*/
} SDL_Jeu;

/********************************************//**
 * \brief Amelioration de la fonction SDL_BlitSurface
 *
 * \param [in,out] Destination Surface de destination
 * \param [in] Source Surface source
 * \param [in] CadredeSelection le cadre de la source à coller
 * \param [in] x la coordonnée où coller
 * \param [in] y la coordonnée où coller
 *
 ***********************************************/
void collerSurface(SDL_Surface* Destination,SDL_Surface* Source,SDL_Rect* CadredeSelection,int x,int y);

/********************************************//**
 * \brief Meme chose que collerSurface mais Libere la source à la fin des operations
 *
 * \param [in,out] Destination Surface de destination
 * \param [in] Source Surface source
 * \param [in] CadredeSelection le cadre de la source à coller
 * \param [in] x la coordonnée où coller
 * \param [in] y la coordonnée où coller
 * A utiliser avec zoomSurf ou rotation dans la source
 ***********************************************/
void collerSurfacetemp(SDL_Surface* Destination,SDL_Surface* Source,SDL_Rect* CadredeSelection,int x,int y);

//FONCTION QUI FAIT TOUT
/********************************************//**
 * \brief LA seule fonction à appeler du module SDL_jeu (il fait tout)
 *
 * \param [in,out] Ecran L'ecran sur lequel afficher
 * \return L'issue du jeu 1:gameover 2:Gagné
 *
 ***********************************************/
int SDL_jeu(SDL_Surface *Ecran);


void initSDL_Jeu(SDL_Jeu* J);
int boucleSDL_Jeu(SDL_Jeu* J,SDL_Surface *Ecran);

/********************************************//**
 * \brief rotation d'un SDL_Surface
 *
 * \param [in] s La surface source
 * \param [in] cadre Le cadre du sprite à rotationner
 * \param [in] angle l'angle en radian
 * \return Une nouvelle surface
 *
 ***********************************************/
SDL_Surface* rotation(SDL_Surface* s,SDL_Rect* cadre,float angle);

/********************************************//**
 * \brief zoom d'une surface
 *
 * \param [in] s La surface source
 * \param [in] cadre Le cadre du sprite à rotationner
 * \param [in] zommin Le degre de zoom (1 degre neutre)
 * \return Une nouvelle surface
 *
 ***********************************************/
SDL_Surface* zoomSurf(SDL_Surface* s,SDL_Rect* cadre,float zoomin);

void detruireSDL_Jeu(SDL_Jeu* J);

void collageGUI_SDL_Jeu(SDL_Jeu* J,SDL_Surface *Ecran);
void collageTerrainSDL_Jeu(SDL_Jeu* J,SDL_Surface *Ecran);
void collagePersosSDL_Jeu(SDL_Jeu* J,SDL_Surface *Ecran);
void collageTirsSDL_Jeu(SDL_Jeu* J,SDL_Surface *Ecran);
void collageSDL_Jeu(SDL_Jeu* J,SDL_Surface *Ecran,SDL_Surface *terrain);

#endif // SDL_JEU_INCLUDED
